#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <sys/stat.h>
#include <string>
#include <cerrno>
#include <string.h>
 
int main(int argc, char const *argv[])
{
    int fd;
    std::string pathname = "/tmp/fifo_test_for_demo";  // 保持路径与写入端一致
 
    // 打开文件描述符
    // 对有名管道的特殊文件 创建fd
    fd = open(pathname.c_str(), O_RDONLY);
    if (fd == -1) {
        std::cerr << "open: " << strerror(errno) << std::endl;
        return EXIT_FAILURE;
    }
 
    // 读取来自管道的数据
    // 从管道接收的数据打印到控制台
    char buf[100];  // 定义一个固定大小的缓冲区
    ssize_t numRead;
    while ((numRead = read(fd, buf, sizeof(buf))) > 0) {  // 使用括号明确运算顺序
        // 读到数据 写入到控制台
        if (write(STDOUT_FILENO, buf, numRead) != numRead) {  // 使用标准输出的文件描述符
            std::cerr << "write: " << strerror(errno) << std::endl;
            close(fd);
            return EXIT_FAILURE;
        }
    }
 
    if (numRead == -1) {
        std::cerr << "read: " << strerror(errno) << std::endl;
        close(fd);
        return EXIT_FAILURE;
    }
 
    std::cout << "接收管道数据成功,无异常，打印到控制台" << std::endl;
    close(fd);
    return 0;
}
 
 
 